﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace inf_1007_devoir3
{
    class CtrlVehicule
    {
        private static CtrlVehicule instance;
        private List<Vehicule> vehicules;
        //constructeur
        private CtrlVehicule()
        {
            vehicules = new List<Vehicule>();

            initialiser();
        }
        //instancier le singleton
        public static CtrlVehicule getInstance()
        {
            if (instance == null)
            {
                instance = new CtrlVehicule();
            }

            return instance;
        }
        //ouvrir la fenetre de gestion des véhicule directement en mode ajout
        public void afficherListeVehicule(int indexMod)
        {
            gestionVehicule frm = new gestionVehicule(indexMod);

            frm.ShowDialog();
        }
        //ouvrir la fenetre de gestion des véhicule en mode de consultation
        public void afficherListeVehicule(Vehicule vehicule, int indexV,int indexM)
        {
            gestionVehicule frm = new gestionVehicule(vehicule, indexV, indexM);

            frm.ShowDialog();
        }
        //initialiser une liste de véhicule
        private void initialiser()
        { 
            vehicules.Add(new Vehicule(1001,"AAA111","AZ3D3346FFTHW","Rouge",100000,CtrlModele.getInstance().getModeles()[0]));
            vehicules.Add(new Vehicule(1002, "BBB222", "ADFSF4R5496GG", "Blanc", 30000, CtrlModele.getInstance().getModeles()[0]));
            vehicules.Add(new Vehicule(1003, "CCC333", "RTY5342D37FDTRFFW", "Bleu", 15000, CtrlModele.getInstance().getModeles()[1]));
            vehicules.Add(new Vehicule(1004, "DDD444", "GFDG546FG44D3FRFS", "Vert", 25000, CtrlModele.getInstance().getModeles()[2]));
            vehicules.Add(new Vehicule(1005, "EEE555", "REFDG4323W21W3R43", "Gris", 150000, CtrlModele.getInstance().getModeles()[2]));
            vehicules.Add(new Vehicule(1006, "FFF666", "F4RRREWR232325T", "Beige", 130000, CtrlModele.getInstance().getModeles()[0]));
        }
        //obtenir la liste de véhicule et la recherche
        public List<Vehicule> getVehicules(int ordre = 0, string[] recherche = null)
        {
            List<Vehicule> arrayVehicules = new List<Vehicule>();

            for (int i = 0; i < vehicules.Count; i++)
            {
                bool ajout = true;

                if (recherche != null)
                {
                    if (recherche[0] != "" && !vehicules[i].getNoLocation().ToString().Contains(recherche[0]))
                    {
                        ajout = false;
                    }

                    if (recherche[1] != "" && !vehicules[i].getModele().getAnnee().ToString().Contains(recherche[1]))
                    {
                        ajout = false;
                    }

                    if (recherche[2] != "" && !vehicules[i].getModele().getMarque().Contains(recherche[2]))
                    {
                        ajout = false;
                    }

                    if (recherche[3] != "" && !vehicules[i].getModele().getModele().Contains(recherche[3]))
                    {
                        ajout = false;
                    }

                    if (recherche[4] != "" && !vehicules[i].getCouleur().Contains(recherche[4]))
                    {
                        ajout = false;
                    }
                    if (recherche[5] != "" && !vehicules[i].getModele().getTraction().Contains(recherche[5]))
                    {
                        ajout = false;
                    }
                    if (recherche[6] != "" && !vehicules[i].getModele().getTransmission().Contains(recherche[6]))
                    {
                        ajout = false;
                    }
                    if (recherche[7] != "" && !vehicules[i].getModele().getNbrPlaces().ToString().Contains(recherche[7]))
                    {
                        ajout = false;
                    }
                    if (recherche[8] != "" && !vehicules[i].getModele().getNbrPortes().ToString().Contains(recherche[8]))
                    {
                        ajout = false;
                    }
                }

                if (ajout)
                    arrayVehicules.Add(vehicules[i]);
            }

            //Tri de la liste

            switch (ordre)
            {
                case 0:
                    arrayVehicules.Sort((x, y) => string.Compare(x.getNoLocation().ToString(), y.getNoLocation().ToString()));
                    break;
                case 1:
                    arrayVehicules.Sort((x, y) => string.Compare(x.getModele().getAnnee().ToString(), y.getModele().getAnnee().ToString()));
                    break;
                case 2:
                    arrayVehicules.Sort((x, y) => string.Compare(x.getModele().getMarque(), y.getModele().getMarque()));
                    break;
                case 3:
                    arrayVehicules.Sort((x, y) => string.Compare(x.getModele().getModele(), y.getModele().getModele()));
                    break;
                case 4:
                    arrayVehicules.Sort((x, y) => string.Compare(x.getCouleur(), y.getCouleur()));
                    break;
                case 5:
                    arrayVehicules.Sort((x, y) => string.Compare(x.getModele().getTraction(), y.getModele().getTraction()));
                    break;
                case 6:
                    arrayVehicules.Sort((x, y) => string.Compare(x.getModele().getTransmission(), y.getModele().getTransmission()));
                    break;
                case 7:
                    arrayVehicules.Sort((x, y) => string.Compare(x.getModele().getNbrPlaces().ToString(), y.getModele().getNbrPlaces().ToString()));
                    break;
                case 8:
                    arrayVehicules.Sort((x, y) => string.Compare(x.getModele().getNbrPortes().ToString(), y.getModele().getNbrPortes().ToString()));
                    break;
            }

            return arrayVehicules;
        }
        //obtenir un véhicule
        public Vehicule getVehicule(int noLocation)
        {
            foreach (Vehicule v in vehicules)
            {
                if (noLocation == v.getNoLocation())
                {
                    return v;
                }
            }

            return null;
        }
        //ajouter un véhicule
        public void ajouterVehicule(int _noLocation, string _immatriculation, string _noSerie, string _couleur, int _kilometrage, Modele _modele)
        { 
            vehicules.Add(new Vehicule(_noLocation, _immatriculation, _noSerie, _couleur, _kilometrage, _modele));
        }
    }
}
